import logging
import os

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QGridLayout, QLabel, QWidget, QPushButton, QDialog, QComboBox, QHBoxLayout
from pyqt_music_player_widget import MusicPlayerWidget

from config import config_file_path
from prepare_for_examen import right_icon, icon_size
from system import run_command


class AudioSettingsWidget(QDialog):
    def __init__(self, mainwindow=None):
        QDialog.__init__(self)
        self.mainwindow = mainwindow
        self.initUI()

    def save_audio_settings(self):
        run_command(f'py-ini-config set '
                    f'{config_file_path} AudioSettings audiodriver "{self.audio_drivers_combobox.currentText().strip()}"')
        try:
            self.mainwindow.prepare_for_examen_widget.audio_label.icon.setPixmap(
                QIcon.fromTheme(right_icon).pixmap(icon_size))
            self.mainwindow.prepare_for_examen_widget.chosen_audio_label.setText(
                f'Выбранный аудиодрайвер: {self.audio_drivers_combobox.currentText().strip()}')
        except Exception as e:
            logging.info(f'Не удалось обновить информацию об аудиодрайвере в виджете настройки экзамена. '
                         f'Исключение: {e}')
        self.musicPlayerWidget.stop()
        self.musicPlayerWidget.deleteLater()
        self.accept()

    def enable_saving(self):
        self.save_button.setEnabled(True)
        self.musicPlayerWidget.stop()

    def disable_saving(self):
        self.save_button.setDisabled(True)
        self.musicPlayerWidget.stop()

    def cancel_function(self):
        self.musicPlayerWidget.stop()
        self.musicPlayerWidget.deleteLater()
        self.reject()

    def initUI(self):
        layout = QGridLayout()
        self.setLayout(layout)

        layout.addWidget(QLabel('Аудиодрайвер'), 0, 0)

        # TODO как работать с драйверами аудио?
        audio_drivers_list = ['Generic Audio Driver']
        self.audio_drivers_combobox = QComboBox()
        self.audio_drivers_combobox.addItems(audio_drivers_list)
        layout.addWidget(self.audio_drivers_combobox, 1, 0)
        resresh_widget = QWidget()
        refresh_widget_layout = QHBoxLayout()
        resresh_widget.setLayout(refresh_widget_layout)
        refresh_audio_drivers_button = QPushButton('↻')
        refresh_audio_drivers_button.setFixedWidth(30)
        refresh_widget_layout.addWidget(refresh_audio_drivers_button)
        refresh_widget_layout.addStretch()
        layout.addWidget(resresh_widget, 1, 1)
        attention_label = QLabel('<b>ⓘ Внимание!</b> При смене выбранного аудиодрайвера '
                                 'необходимо выполнить проверку воспроизведения повторно.')
        attention_label.setStyleSheet('QLabel {background-color: #d0d0ff; margin: 5px; color: black;}')
        layout.addWidget(attention_label, 2, 0, 1, 2)

        info_label_1 = QLabel('Выберите аудиодрайвер, нажмите "Старт" для начала воспроизведения звука и при '
                              'необходимости измените уровень громкости воспроизведения аудиофайлов при проведении '
                              'экзамена.')
        info_label_1.setWordWrap(True)
        layout.addWidget(info_label_1, 3, 0, 1, 2)

        info_label_2 = QLabel('<b>В день экзамена на случай нештатных ситуаций организатору будут доступны '
                              'следующие функции при проигрывании КИМ:</b>')
        info_label_2.setWordWrap(True)
        layout.addWidget(info_label_2, 4, 0, 1, 2)

        info_label_3 = QLabel('<ul><li>изменение уровня громкости воспроизведения (регулятор уровня громкости);</li>'
                              '<li>переход к определённому времени начала воспроизведения (ползунок);</li>'
                              '<li>кнопка "Пауза" для остановки и "Старт" для начала воспроизведения после остановки.'
                              '</li></ul>')
        layout.addWidget(info_label_3, 5, 0, 1, 2)

        info_label_4 = QLabel('<b>Проверка качества воспроизведения звука:</b>')
        layout.addWidget(info_label_4, 6, 0, 1, 2)

        info_label_5 = QLabel('<ul><li>убедитесь, что звук не прерывается и не искажён, текст слышно отчётливо;</li>'
                              '<li>в случае плохого качества воспроизведения выберите другой аудиодрайвер или измените '
                              'настройки аудиооборудования средствами операционной системы;</li>'
                              '<li>если настройкой аудиооборудования не удаётся достичь необходимого качества '
                              'воспроизведения, то данный рабочий компьютер для проведения экзамена с воспроизведением '
                              'нельзя использовать на экзамене и его необходимо заменить.</li></ul>')
        info_label_5.setWordWrap(True)
        layout.addWidget(info_label_5, 7, 0, 1, 2)

        attention_label_2 = QLabel('<b>ⓘ Внимание!</b> Тестовая аудиозапись соответствует файлу аудирования '
                                   'по английскому языку.')
        attention_label_2.setStyleSheet('QLabel {background-color: #d0d0ff; margin: 5px; color: black;}')
        layout.addWidget(attention_label_2, 8, 0, 1, 2)

        # FIXME этот виджет работает только с mp3 и абсолютной адресацией
        self.musicPlayerWidget = MusicPlayerWidget()
        self.musicPlayerWidget.setMedia(os.path.join(os.getcwd(), 'resources/test_audio.mp3'))
        layout.addWidget(self.musicPlayerWidget, 9, 0, 1, 2)

        info_label_6 = QLabel('Выполненная проверка удовлетворяет требованиям к качеству воспроизведения звука?')
        layout.addWidget(info_label_6, 10, 0, 1, 2)

        yesnowidget = QWidget()
        yesnowidget_layout = QHBoxLayout()
        yesnowidget_layout.setAlignment(Qt.AlignLeft)
        yesnowidget.setLayout(yesnowidget_layout)
        yes_button = QPushButton('Да')
        yes_button.setFixedWidth(100)
        yes_button.clicked.connect(self.enable_saving)
        no_button = QPushButton('Нет')
        no_button.setFixedWidth(100)
        no_button.clicked.connect(self.disable_saving)
        yesnowidget_layout.addWidget(no_button)
        yesnowidget_layout.addWidget(yes_button)
        yesnowidget_layout.addStretch()
        layout.addWidget(yesnowidget, 11, 0)

        cancel_button = QPushButton('Отменить')
        cancel_button.clicked.connect(self.cancel_function)
        layout.addWidget(cancel_button, 12, 0)
        self.save_button = QPushButton('Сохранить')
        self.save_button.setDisabled(True)
        self.save_button.clicked.connect(self.save_audio_settings)
        layout.addWidget(self.save_button, 12, 1)

        layout.setColumnStretch(0, 1)
        layout.setColumnStretch(1, 1)
        self.setWindowTitle('Настройка аудиовоспроизведения')
